#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

void menu()
{
	printf("\t*******************************************************\n");
	printf("\t*****               Welcome to play!               *****\n");
	printf("\t*****              全民制作人大家好!               *****\n");
	printf("\t*****          我是练习时长30个月的魔术师          *****\n");
	printf("\t*****       作为观众,请在心中想一个三位数abc       *****\n");
	printf("\t*****      a、b、c分别是百位，十位和个位数字       *****\n");
	printf("\t*****  告诉我acb、bac、bca、cab、cba这5个数的和值  *****\n");
	printf("\t*****             虽然我不会唱跳rap篮球            *****\n");
	printf("\t*****     但我只看一眼就能猜到你心里想的原数abc    *****\n");
	printf("\t*****               或者你来当魔术师               *****\n");
	printf("\t*****            猜猜我心中的abc是多少?            *****\n");
	printf("\t*****               只因你实在太美                 *****\n");
	printf("\t*******************************************************\n");
}

int Viewer(int nSum)
{
	int nNumber = 0;
	int nCon;	   // a+b+c的循环变量
	int nStart;	   // a+b+c的最小取值
	int nEnd;	   // a+b+c的最大取值
	int nHundreds; // 百位
	int nTens;	   // 十位
	int nOnes;	   // 个位
	nStart = (nSum + 100) / 222;
	nEnd = (nSum + 999) / 222;
	for (nCon = nStart; nCon <= nEnd; nCon++)
	{
		nNumber = nCon * 222 - nSum;
		nHundreds = nNumber / 100;
		nTens = nNumber / 10 % 10;
		nOnes = nNumber % 10;
		if (nHundreds + nTens + nOnes == nCon)
			return nNumber;
	}
	return 0;
}

int Magician(int *pnSum)
{
	int nNumber = rand() % 900 + 100; // a+b+c在100-999之间
	int nHundreds = nNumber / 100;	  // 百位
	int nTens = nNumber / 10 % 10;	  // 十位
	int nOnes = nNumber % 10;		  // 个位
	*pnSum = nHundreds * 100 + nTens + nOnes * 10 + nHundreds * 10 + nTens * 100 + nOnes + nHundreds * 10 + nTens + nOnes * 100 + nHundreds + nTens * 10 + nOnes * 100 + nHundreds + nTens * 100 + nOnes * 10;
	return nNumber;
}

void game(int *pnSum)
{
	int model = 0;
	int key;
l1:
	printf("1、你来当观众2、你来当魔术师3、退出游戏\n请选择游戏模式:->");
	scanf(" %d", &model);
	switch (model)
	{
	case 1: // 玩家是观众
		while (1)
		{
			printf("请告诉我acb、bac、bca、cab、cba这5个数的和值:->");
			scanf(" %d", pnSum);
			if (*pnSum >= 122 && *pnSum <= 4995)
				break;
			else
				printf("你干嘛~哈哈哎哟~\n输入有错,请重新输入!\n");
		}
		key = Viewer(*pnSum);
		if (key)
		{
			printf("怎么还没有人进来\n");
			Sleep(1000);
			printf("哇真的是 %d 啊\n", key);
			Sleep(300);
			printf("厉不厉害你坤哥\n");
		}
		else
			printf("你干嘛~~哈哈哎哟~~\n");
		printf("根本没有这样的abc,你这和值有问题啊!!!(恼)\n");
		break;
	case 2:
		key = Magician(pnSum);
		printf("acb、bac、bca、cab、cba这5个数的和值为 %d, 猜猜原来的abc为多少呢?\n", *pnSum);
		int GuessNumber;
		while (1)
		{
			scanf(" %d", &GuessNumber);
			if (GuessNumber >= 100 && GuessNumber <= 999)
				break;
			else
				printf("你干嘛~~哈哈哎哟~~\n");
			printf("请输入一个正常的三位数!!!(恼)\n");
		}
		if (GuessNumber == key)
			printf("猜对了!!!哎呀哈哈amagi\n");
		else
		{
			printf("猜错了!荔枝一点行不行!\n");
			printf("正确答案为: %d\n", key);
			printf("一个真正的man，一个真正的男人他 清楚自己要做什么\n");
		}
	case 3:
		break;
	default:
		printf("输入有错,请重新输入!\n");
		goto l1;
	}
}

int main()
{
	srand((int)time(NULL));
	int nSum;	 // 计算的 5个数的和值
	int nNumber; // 三位数的值
	char Input = 'Y';
	while (Input == 'Y' || Input == 'y')
	{
		system("cls");
		menu();
		game(&nSum);
		while (1)
		{
			printf("还想再玩一次吗?(Y/N)\n");
			scanf(" %c", &Input);
			if (Input != 'Y' && Input != 'y' && Input != 'N' && Input != 'n')
				printf("输入错误,请重新输入!\n");
			else
				break;
		}
	}

	printf("在今后的节目里\n");
	Sleep(300);
	printf("我还准备了很多我自己作词作曲编舞的原创作品\n");
	Sleep(300);
	printf("期待的话请多多为我投票吧\n");
	Sleep(300);

	// 输出对鸽鸽的爱

	printf("\t      ****       ****\n");
	printf("\t   *********   *********\n");
	printf("\t************* *************\n");
	int i, j;
	for (i = 0; i < 3; i++)
	{
		printf("\t");
		for (j = 0; j < 29; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	for (i = 0; i < 7; i++)
	{
		printf("\t");
		for (j = 0; j < 2 * (i + 1) - 1; j++)
		{
			printf(" ");
		}
		for (j = 0; j < 27 - i * 4; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	for (i = 0; i < 22; i++)
	{
		printf(" ");
	}
	printf("*\n");
	return 0;
}
